function callName(a){
    console.log(a);
    var a;
    console.log(a);
    a = '杰倫';
    console.log(a);
  }
  callName('小明')
  
  // 小明
  // 小明
  // 杰倫
hoisting 不會影響 a 的值 除非直接覆蓋
  function callName(a){
    console.log(a);
    function a(){}
    console.log(a);
    a = '杰倫';
    console.log(a);
  }
  callName('小明')
  
  // f a(){}
  // f a(){}
  // 杰倫
範例 1
參數的名稱 & 傳入的參數,是沒有關聯性的
主要看接收了幾個值,不會受到外層名稱的影響
接收參數不足時會以 undefined 呈現
  function callMore(d, c, b, a) {
    console.log(d, c, b, a);
  }
  var a = 'a';
  var b = 'b';
  var c = 'c';
  callMore(a, b, c);
  // a, b, c, undefined
範例 2:傳入物件
  function callObject(obj) {
    obj.name = '杰倫家';
  }
  var family = {
    name: '小明家'
  }
  callObject(family);
  console.log(family);  // {name: "杰倫家"}
範例 3 :如何呈現「小明你好」?
  function callSomeone(name) {
    console.log(name + '你好');
  }
  function functionB(fn) {
    fn('小明');
  }
  function callSomeone(name) {
    console.log(name + '你好');
  }
  function functionB(fn) {
    fn('小明');   // 實際執行的地方
  }
  functionB(callSomeone); // 帶入 callSomeone 執行此段表達式
範例 4
arguments 會自動帶入其他參數arguments 為類陣列,並不是一個純陣列  function callArg(a) {
    console.log(a, arguments);
  }
  callArg(1, 2, 3, '4');
  // 1, Arguments(4) [1, 2, 3, "4"]